Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 376d19660df92404861e34942cb8f9e7de0981eb


Parents : 2ab4ec5
Author : Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-04-23T02:29:21-05:00

feat(localization): add localization files with new map features, error messages, and telemetry history support across multiple languages

Changes
Diff

diff --git a/meshchatx/src/frontend/locales/de.json b/meshchatx/src/frontend/locales/de.json
index d07a6da0..98d76085 100644
--- a/meshchatx/src/frontend/locales/de.json
+++ b/meshchatx/src/frontend/locales/de.json
@@ -866,7 +866,13 @@
"search_placeholder": "Nach einem Ort suchen...",
"search_offline_error": "Suche ist nur im Online-Modus verfügbar",
"search_connection_error": "Verbindung zum Suchdienst fehlgeschlagen. Bitte überprüfen Sie Ihre Internetverbindung.",
+ "search_timeout_error": "Der Geocoder hat nicht rechtzeitig geantwortet. Er kann langsam, überlastet oder nicht erreichbar sein. Bitte erneut versuchen.",
"search_error": "Suchfehler",
+ "tile_connectivity_title": "Kartenkacheln konnten nicht geladen werden",
+ "tile_connectivity_body": "Prüfen Sie die Verbindung, versuchen Sie es erneut, nutzen Sie einen lokalen Kachelserver in den Einstellungen oder den Offline-Modus mit MBTiles.",
+ "tile_connectivity_retry": "Kacheln erneut laden",
+ "tile_connectivity_use_offline": "Offline-Modus",
+ "tile_connectivity_dismiss": "Schließen",
"search_no_results": "Keine Ergebnisse gefunden",
"custom_tile_server_unavailable": "Benutzerdefinierter Kachelserver ist im Offline-Modus nicht erreichbar",
"custom_nominatim_unavailable": "Benutzerdefinierter Nominatim-Server ist im Offline-Modus nicht erreichbar",
@@ -878,6 +884,19 @@
"tool_polygon": "Polygon zeichnen",
"tool_circle": "Kreis zeichnen",
"tool_measure": "Messen",
+ "tool_bearing": "Peilung und Distanz (zwei Taps, offline)",
+ "tool_bearing_from_here": "Peilung von meinem Standort mit einem Tap",
+ "bearing_geodesic": "Geodäte (Großkreis)",
+ "bearing_rhumb": "Loxodrome (konstante Peilung)",
+ "bearing_forward": "Vorwärtsazimut",
+ "bearing_back": "Rückwärtsazimut",
+ "bearing_rhumb_line": "Loxodrompeilung / zurück",
+ "bearing_hint_first": "Startpunkt tippen, dann Endpunkt.",
+ "bearing_hint_second": "Endpunkt tippen.",
+ "bearing_hint_destination": "Ziel auf der Karte tippen.",
+ "bearing_from_here": "Meinen Standort als Start",
+ "bearing_help_first": "Start tippen, dann Ende",
+ "bearing_help_drag": "Zeiger bewegen für Live-Anzeige",
"tool_clear": "Zeichnungen löschen",
"save_drawing": "Ebene speichern",
"load_drawing": "Ebene laden",
@@ -917,7 +936,42 @@
"location_not_determined": "Could not determine your location",
"geolocation_not_supported": "Geolocation is not supported by your browser",
"no_nodes_location": "No discovered nodes with location found",
- "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping"
+ "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "Deaktivieren",
@@ -976,6 +1030,17 @@
"more_actions": "Weitere Aktionen",
"retry_failed": "Fehlgeschlagene erneut senden",
"telemetry_history": "Telemetrie-Verlauf",
+ "telemetry_history_modal_title": "Telemetrie-Verlauf",
+ "telemetry_history_empty": "Für diesen Peer wurde kein Telemetrie-Verlauf gefunden.",
+ "telemetry_history_done": "Fertig",
+ "telemetry_show_in_chat": "Telemetrie im Haupt-Chat anzeigen",
+ "telemetry_battery_trend": "Akkutrend",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "Gesendet",
+ "telemetry_label_received": "Empfangen",
+ "telemetry_battery_level": "Akku: {percent}%",
+ "telemetry_snr_db": "SNR: {snr} dB",
+ "telemetry_location_request": "Standortanfrage",
"start_call": "Anruf",
"share_contact": "Kontakt teilen",
"opportunistic_deferred_label": "Wartend",
@@ -1026,6 +1091,11 @@
"failed_copy_message": "Nachricht konnte nicht kopiert werden",
"failed_send_ingest": "Failed to send ingest request",
"address_copied": "Your LXMF address copied to clipboard",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"failed_copy_address": "Failed to copy address",
"translation_failed": "Übersetzung fehlgeschlagen",
"failed_add_contact": "Failed to add contact",
@@ -1197,7 +1267,7 @@
},
"docs": {
"title": "Dokumentation",
- "subtitle": "Handbücher zu Reticulum und MeshChat.",
+ "subtitle": "Reticulum-Handbuch und MeshChatX-Anleitungen, nach Einrichtung offline lesbar.",
"status_title": "Dokumentationsstatus",
"status_extracting": "Wird entpackt...",
"status_available": "Offline-Handbuch verfügbar",
@@ -1228,7 +1298,7 @@
"tools": {
"utilities": "Dienstprogramme",
"power_tools": "Dienstprogramme",
- "diagnostics_description": "Erreichbarkeit, Übertragungen, Pfade, Übersetzung, Handbücher und Hardware-Hilfen an einem Ort.",
+ "diagnostics_description": "Mesh- und Reticulum-Werkzeuge an einem Ort: Erreichbarkeit, Pfade, Dateitransfer, Übersetzung, Dokumentation und Hardware-Hilfen. Öffnen Sie eine Zeile für die vollständige Ansicht.",
"ping": {
"title": "Ping",
"description": "Laufzeit bis zu einem Ziel, das Ping akzeptiert."
@@ -1282,6 +1352,10 @@
"title": "Weiterleiter",
"description": "LXMF zwischen Adressen weiterleiten, mit erhaltenem Antwort-Routing."
},
+ "propagation_nodes": {
+ "title": "Propagationsknoten",
+ "description": "Bevorzugte Mesh-Propagationsknoten wählen, Live-Statistiken sehen und schnelle Pfadprüfungen ausführen."
+ },
"sieve_filters": {
"title": "Sieb-Filter",
"description": "Text in Peer-Feldern und/oder Nachrichtentitel und -inhalt abgleichen, dann Unterhaltung ausblenden, Benachrichtigungen stellen, Ordner zuweisen oder Absender vollständig blockieren (verbannen).",
@@ -1336,6 +1410,51 @@
"flow_folder": "Ordner",
"flow_no_rules": "Keine Regeln"
},
+ "repository_server": {
+ "title": "Repository-Server",
+ "description": "Verteilen Sie MeshChatX- und Reticulum-bezogene Python-Wheels sowie eigene Dateien über einfaches HTTP, damit andere im Netz oder auf diesem Gerät sie herunterladen können.",
+ "subtitle": "Mit Netz: gebündelte Wheel-Sammlung aktualisieren; eigene Dateien jederzeit hinzufügen; kleine Download-Seite in der App starten oder den separaten HTTP-Helfer nutzen.",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "RNode-Firmware im Browser flashen oder aktualisieren (unterstützte Hardware).",
@@ -1553,7 +1672,7 @@
},
"reticulum_config_editor": {
"title": "Reticulum Konfigurations-Editor",
- "description": "Bearbeiten Sie die rohe Reticulum-Konfigurationsdatei in der App. Nützlich auf Mobilgeräten, wo die Datei im privaten Speicher liegt.",
+ "description": "Die zentrale Reticulum-(RNS-)Konfigurationsdatei direkt in MeshChatX bearbeiten. RNS neu starten, damit Änderungen gelten.",
"info": "Dies ist die rohe Reticulum-Konfigurationsdatei. Speichern wendet die Änderungen erst nach einem Neustart von RNS an.",
"loading": "Konfiguration wird geladen...",
"reload": "Neu laden",
@@ -1578,7 +1697,7 @@
"tips_title": "Tipps",
"tip_sections": "Die Konfiguration muss die Abschnitte [reticulum] und [interfaces] enthalten.",
"tip_restart": "Verwende die Schaltfläche RNS neu starten oder die Schnittstellen-Seite, um Änderungen anzuwenden.",
- "tip_mobile": "Auf Mobilgeräten ist dies der einfachste Weg, Reticulum ohne externen Editor anzupassen."
+ "tip_mobile": "Praktisch, wenn Sie die Datei nicht in einem externen Editor auf der Festplatte bearbeiten möchten."
},
"paper_message": {
"title": "Papiernachricht",
@@ -2078,6 +2197,8 @@
"nav_forwarder_desc": "LXMF-Weiterleitungsregeln",
"nav_documentation": "Dokumentation",
"nav_documentation_desc": "Offline-Handbücher",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "MeshChatX-Wheels, Reticulum-Pakete und Ihre Dateien über HTTP",
"nav_micron_editor": "Micron-Editor",
"nav_micron_editor_desc": "Micron-Markup bearbeiten",
"nav_reticulum_config_editor": "Reticulum Konfigurations-Editor",
@@ -2119,7 +2240,7 @@
},
"debug": {
"title": "Debug Logs",
- "description": "Anwendungsprotokolle durchsuchen und nach Stufe filtern.",
+ "description": "Anwendungs- und Zugriffsprotokolle anzeigen, nach Schweregrad filtern und bei der Fehlersuche durchsuchen.",
"tab_logs": "Protokolle",
"tab_access_attempts": "Zugriffsversuche",
"search_logs_placeholder": "Protokolle durchsuchen...",

diff --git a/meshchatx/src/frontend/locales/en.json b/meshchatx/src/frontend/locales/en.json
index 8367963d..7fc84c31 100644
--- a/meshchatx/src/frontend/locales/en.json
+++ b/meshchatx/src/frontend/locales/en.json
@@ -2,7 +2,7 @@
"_languageName": "English",
"bots": {
"title": "LXMFy Bots",
- "description": "Simple LXMF bots (echo, notes, reminders) when LXMFy is installed.",
+ "description": "Run simple LXMF bots (echo, notes, reminders) when the LXMFy add-on is installed.",
"bot_framework": "Bot Framework",
"lxmfy_not_detected": "LXMFy not detected",
"lxmfy_not_detected_desc": "To use bots, you must install the LXMFy package:",
@@ -814,7 +814,13 @@
"search_placeholder": "Search for a location...",
"search_offline_error": "Search is only available in online mode",
"search_connection_error": "Failed to connect to search service. Please check your internet connection.",
+ "search_timeout_error": "The geocoder did not respond in time. It may be slow, overloaded, or unreachable. Try again.",
"search_error": "Search error",
+ "tile_connectivity_title": "Map tiles could not be loaded",
+ "tile_connectivity_body": "Check your network, try again, use a local tile server in settings, or switch to offline mode if you have MBTiles loaded.",
+ "tile_connectivity_retry": "Retry tiles",
+ "tile_connectivity_use_offline": "Use offline mode",
+ "tile_connectivity_dismiss": "Dismiss",
"search_no_results": "No results found",
"custom_tile_server_unavailable": "Custom tile server is not accessible in offline mode",
"custom_nominatim_unavailable": "Custom Nominatim server is not accessible in offline mode",
@@ -826,6 +832,19 @@
"tool_polygon": "Draw Polygon",
"tool_circle": "Draw Circle",
"tool_measure": "Measure Distance/Area",
+ "tool_bearing": "Bearing and distance (two taps, offline)",
+ "tool_bearing_from_here": "Bearing from my location to one tap",
+ "bearing_geodesic": "Geodesic (great circle)",
+ "bearing_rhumb": "Rhumb line (constant bearing)",
+ "bearing_forward": "Forward azimuth",
+ "bearing_back": "Back azimuth",
+ "bearing_rhumb_line": "Rhumb bearing / back",
+ "bearing_hint_first": "Tap the start point, then the end point.",
+ "bearing_hint_second": "Tap the end point.",
+ "bearing_hint_destination": "Tap your destination on the map.",
+ "bearing_from_here": "Use my location as start",
+ "bearing_help_first": "Tap start, then end",
+ "bearing_help_drag": "Move the pointer for a live readout",
"tool_clear": "Clear Drawings",
"save_drawing": "Save Drawing Layer",
"load_drawing": "Load Drawing Layer",
@@ -865,7 +884,42 @@
"location_not_determined": "Could not determine your location",
"geolocation_not_supported": "Geolocation is not supported by your browser",
"no_nodes_location": "No discovered nodes with location found",
- "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping"
+ "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "Disable",
@@ -916,6 +970,17 @@
"more_actions": "More actions",
"retry_failed": "Retry failed messages",
"telemetry_history": "Telemetry history",
+ "telemetry_history_modal_title": "Telemetry History",
+ "telemetry_history_empty": "No telemetry history found for this peer.",
+ "telemetry_history_done": "Done",
+ "telemetry_show_in_chat": "Show telemetry in main chat",
+ "telemetry_battery_trend": "Battery trend",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "Sent",
+ "telemetry_label_received": "Received",
+ "telemetry_battery_level": "Battery: {percent}%",
+ "telemetry_snr_db": "SNR: {snr} dB",
+ "telemetry_location_request": "Location Request",
"start_call": "Call",
"share_contact": "Share contact",
"custom_display_name": "Custom Display Name",
@@ -972,6 +1037,11 @@
"failed_copy_message": "Could not copy message",
"failed_send_ingest": "Failed to send ingest request",
"address_copied": "Your LXMF address copied to clipboard",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"hash_copied": "Identity hash copied to clipboard",
"failed_to_copy_hash": "Failed to copy identity hash",
"failed_copy_address": "Failed to copy address",
@@ -1054,7 +1124,7 @@
},
"debug": {
"title": "Debug Logs",
- "description": "Browse application logs and filter by level.",
+ "description": "Read application and access logs, filter by severity, and search when troubleshooting.",
"tab_logs": "Logs",
"tab_access_attempts": "Access attempts",
"search_logs_placeholder": "Search logs...",
@@ -1257,7 +1327,7 @@
},
"docs": {
"title": "Documentation",
- "subtitle": "Reticulum and MeshChat manuals.",
+ "subtitle": "Reticulum manual and MeshChatX guides, available offline after setup.",
"status_title": "Documentation Status",
"status_extracting": "Extracting Documentation...",
"status_available": "Offline Manual Available",
@@ -1288,26 +1358,26 @@
"tools": {
"utilities": "Utilities",
"power_tools": "Utilities",
- "diagnostics_description": "Connectivity checks, transfers, paths, translation, docs, and hardware helpers in one place.",
+ "diagnostics_description": "Mesh and Reticulum utilities in one place: reachability, paths, file transfer, translation, documentation, and hardware helpers. Open any row for the full tool.",
"ping": {
"title": "Ping",
- "description": "Measure round-trip time to a destination that accepts ping."
+ "description": "Measure round-trip time to another node or app that answers ping."
},
"rnprobe": {
"title": "RNProbe",
- "description": "Send probes with configurable payload size to test reachability and delay."
+ "description": "Send test payloads over the mesh to check reachability and delay."
},
"rncp": {
"title": "RNCP",
- "description": "Send and receive files over Reticulum (RNCP) with progress."
+ "description": "Send files to or fetch files from another destination over Reticulum, with progress and optional compression."
},
"rnstatus": {
"title": "RNStatus",
- "description": "Per-interface counters and link-oriented status from Reticulum."
+ "description": "Per-interface traffic counters and link status from your Reticulum instance."
},
"rnpath": {
"title": "RNPath",
- "description": "Inspect paths, announces, and request or drop routes.",
+ "description": "Inspect paths and announce queues, and request or drop routes when you need to steer traffic.",
"failed_fetch": "Failed to fetch path data",
"path_dropped": "Path dropped",
"failed_drop": "Could not drop path",
@@ -1321,7 +1391,7 @@
},
"rnpath_trace": {
"title": "RNS Path Trace",
- "description": "Show the hop list toward a destination hash.",
+ "description": "List each hop along the path to a destination hash.",
"destination_hash": "Destination Hash",
"placeholder": "Enter 32-char destination hash...",
"trace": "Trace Path",
@@ -1336,15 +1406,19 @@
},
"translator": {
"title": "Translator",
- "description": "Translate text via a LibreTranslate server or local Argos Translate."
+ "description": "Translate text with LibreTranslate over the network or Argos Translate on this device."
},
"forwarder": {
"title": "Forwarder",
- "description": "Forward LXMF between addresses with reply routing preserved."
+ "description": "Forward LXMF messages between addresses while keeping reply routing intact."
+ },
+ "propagation_nodes": {
+ "title": "Propagation nodes",
+ "description": "Pick preferred mesh propagation nodes, watch live stats, and run quick path checks."
},
"sieve_filters": {
"title": "Sieve filters",
- "description": "Match text in peer identity fields and/or message title and body, then hide the thread, silence notifications, move it to a folder, or banish the sender (full block).",
+ "description": "Auto-sort mail: match words in peer names or message text, then hide, silence, move to a folder, or block the sender.",
"subtitle": "Rules run in order. Scope picks everyone, contacts only, or non-contacts only. Choose substring or regex matching. The first enabled rule whose scope fits and whose targets match wins.",
"back_tools": "Back to tools",
"rules_heading": "Rules",
@@ -1396,9 +1470,54 @@
"flow_folder": "Folder",
"flow_no_rules": "No rules"
},
+ "repository_server": {
+ "title": "Repository server",
+ "description": "Redistribute MeshChatX and Reticulum-related Python wheels plus your own files over plain HTTP so people on your network—or on this device—can download them.",
+ "subtitle": "When online, refresh the bundled wheel set; add your own files anytime; start a small download page from the app or use the separate HTTP helper.",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
- "description": "Flash or update RNode firmware from the browser (supported hardware).",
+ "description": "Flash or update RNode firmware from the browser when your hardware and browser support USB or Wi‑Fi flashing.",
"select_device": "1. Select your device",
"product": "Product",
"model": "Model",
@@ -1595,7 +1714,7 @@
},
"micron_editor": {
"title": "Micron Editor",
- "description": "Edit Micron markup with a live preview.",
+ "description": "Write Nomad Network Micron pages with a live preview.",
"editor": "Editor",
"preview": "Preview",
"save": "Save",
@@ -1613,7 +1732,7 @@
},
"reticulum_config_editor": {
"title": "Reticulum Config Editor",
- "description": "Edit the raw Reticulum config file in-app. Useful on mobile where the file lives in private storage.",
+ "description": "Edit the main Reticulum (RNS) configuration file inside MeshChatX. Restart RNS to apply changes.",
"info": "This is the raw Reticulum config file. Saving will not apply changes until RNS is restarted.",
"loading": "Loading config...",
"reload": "Reload",
@@ -1638,27 +1757,27 @@
"tips_title": "Tips",
"tip_sections": "The config must contain [reticulum] and [interfaces] sections.",
"tip_restart": "Use the Restart RNS button or the Interfaces page to apply changes.",
- "tip_mobile": "On mobile this is the easiest way to tweak Reticulum without an external editor."
+ "tip_mobile": "Useful whenever you prefer not to edit the file in another program on disk."
},
"paper_message": {
"title": "Paper Message",
- "description": "Create or scan QR-encoded LXMF paper messages."
+ "description": "Encode LXMF messages as QR codes or scan codes back into the app."
},
"mesh_server": {
"title": "Mesh Server",
- "description": "Host Micron pages and files for peers on the mesh."
+ "description": "Publish Micron pages and small files for mesh peers to open."
},
"rns_tunnel": {
"title": "RNS Tunnel",
- "description": "IP tunneling over Reticulum links (in development)."
+ "description": "Carry IP traffic over Reticulum links (in development)."
},
"rns_filesync": {
"title": "RNS Filesync",
- "description": "File sync between mesh peers (in development)."
+ "description": "Sync files between mesh peers (in development)."
},
"bots": {
"title": "LXMFy Bots",
- "description": "Simple LXMF bots (echo, notes, reminders) when LXMFy is installed."
+ "description": "Run simple LXMF bots (echo, notes, reminders) when the LXMFy add-on is installed."
}
},
"ping": {
@@ -2190,6 +2309,8 @@
"nav_forwarder_desc": "LXMF forwarding rules",
"nav_documentation": "Documentation",
"nav_documentation_desc": "Offline manuals",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "MeshChatX wheels, Reticulum packages, and your files over HTTP",
"nav_micron_editor": "Micron Editor",
"nav_micron_editor_desc": "Edit Micron markup",
"nav_reticulum_config_editor": "Reticulum Config Editor",

diff --git a/meshchatx/src/frontend/locales/es.json b/meshchatx/src/frontend/locales/es.json
index d7636434..dfadef51 100644
--- a/meshchatx/src/frontend/locales/es.json
+++ b/meshchatx/src/frontend/locales/es.json
@@ -814,7 +814,13 @@
"search_placeholder": "Buscar un lugar...",
"search_offline_error": "La búsqueda sólo está disponible en modo online",
"search_connection_error": "Failed to connect to search service. Por favor, revise su conexión a Internet.",
+ "search_timeout_error": "El geocodificador no respondió a tiempo. Puede estar lento, saturado o no disponible. Inténtelo de nuevo.",
"search_error": "Error de búsqueda",
+ "tile_connectivity_title": "No se pudieron cargar los mosaicos del mapa",
+ "tile_connectivity_body": "Compruebe la red, reintente, use un servidor de mosaicos local en ajustes o el modo sin conexión si tiene MBTiles.",
+ "tile_connectivity_retry": "Reintentar mosaicos",
+ "tile_connectivity_use_offline": "Modo sin conexión",
+ "tile_connectivity_dismiss": "Cerrar",
"search_no_results": "No se han encontrado resultados",
"custom_tile_server_unavailable": "El servidor de baldosas personalizado no es accesible en modo offline",
"custom_nominatim_unavailable": "Nominatim servidor personalizado no es accesible en modo offline",
@@ -826,6 +832,19 @@
"tool_polygon": "Dibujo Polygon",
"tool_circle": "Draw Circle",
"tool_measure": "Distancia de Medición/Área",
+ "tool_bearing": "Rumbo y distancia (dos toques, sin conexión)",
+ "tool_bearing_from_here": "Rumbo desde mi ubicación con un toque",
+ "bearing_geodesic": "Geodésica (ortodrómica)",
+ "bearing_rhumb": "Loxodrómica (rumbo constante)",
+ "bearing_forward": "Azimut directo",
+ "bearing_back": "Azimut inverso",
+ "bearing_rhumb_line": "Rumbo loxodrómico / inverso",
+ "bearing_hint_first": "Toca el inicio y luego el fin.",
+ "bearing_hint_second": "Toca el punto final.",
+ "bearing_hint_destination": "Toca el destino en el mapa.",
+ "bearing_from_here": "Usar mi ubicación como inicio",
+ "bearing_help_first": "Toca inicio y fin",
+ "bearing_help_drag": "Mueve el puntero para ver en vivo",
"tool_clear": "Dibujos claros",
"save_drawing": "Guardar capa de dibujo",
"load_drawing": "Carga de dibujo de capa",
@@ -865,7 +884,42 @@
"location_not_determined": "No podría determinar su ubicación",
"geolocation_not_supported": "Geolocalización no es compatible con su navegador",
"no_nodes_location": "No descubrieron nodos con localización encontrada",
- "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping"
+ "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "Inhabilitación",
@@ -916,6 +970,17 @@
"more_actions": "Más acciones",
"retry_failed": "Retry falló mensajes",
"telemetry_history": "Historia de la telemetría",
+ "telemetry_history_modal_title": "Historial de telemetría",
+ "telemetry_history_empty": "No hay historial de telemetría para este par.",
+ "telemetry_history_done": "Listo",
+ "telemetry_show_in_chat": "Mostrar telemetría en el chat principal",
+ "telemetry_battery_trend": "Tendencia de la batería",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "Enviado",
+ "telemetry_label_received": "Recibido",
+ "telemetry_battery_level": "Batería: {percent}%",
+ "telemetry_snr_db": "SNR: {snr} dB",
+ "telemetry_location_request": "Solicitud de ubicación",
"start_call": "Call",
"share_contact": "Comparta contacto",
"custom_display_name": "Nombre de la pantalla personalizada",
@@ -972,6 +1037,11 @@
"failed_copy_message": "No se pudo copiar el mensaje",
"failed_send_ingest": "Failed to send ingest request",
"address_copied": "Tu dirección LXMF copiada para el portapapeles",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"hash_copied": "Hah de identidad copiado a portapapeles",
"failed_to_copy_hash": "Failed to copy identity hash",
"failed_copy_address": "Failed to copy address",
@@ -1054,7 +1124,7 @@
},
"debug": {
"title": "Debug Logs",
- "description": "Examine los registros de aplicaciones y filtro por nivel.",
+ "description": "Registros de aplicación y de acceso, filtro por gravedad y búsqueda para resolver incidencias.",
"tab_logs": "Logs",
"tab_access_attempts": "Pruebas de acceso",
"search_logs_placeholder": "Registros de búsqueda...",
@@ -1257,7 +1327,7 @@
},
"docs": {
"title": "Documentación",
- "subtitle": "Manuales Reticulum y MeshChat.",
+ "subtitle": "Manual de Reticulum y guías MeshChatX, disponibles sin conexión tras la configuración.",
"status_title": "Situación de la documentación",
"status_extracting": "Extrayendo...",
"status_available": "Manual disponible",
@@ -1288,7 +1358,7 @@
"tools": {
"utilities": "Utilidades",
"power_tools": "Utilidades",
- "diagnostics_description": "Controles de conectividad, transferencias, caminos, traducción, docs y ayudantes de hardware en un solo lugar.",
+ "diagnostics_description": "Utilidades de malla y Reticulum en un mismo sitio: alcance, rutas, transferencia de archivos, traducción, documentación y ayudas de hardware. Abra una fila para la herramienta completa.",
"ping": {
"title": "Ping",
"description": "Medir el tiempo de ida y vuelta a un destino que acepta ping."
@@ -1342,6 +1412,10 @@
"title": "Forwarder",
"description": "Forward LXMF entre direcciones con réplica conservado."
},
+ "propagation_nodes": {
+ "title": "Nodos de propagación",
+ "description": "Elija nodos de propagación preferidos, vea estadísticas en vivo y compruebe rutas."
+ },
"sieve_filters": {
"title": "Filtros tamiz",
"description": "Coincidir texto en datos del par y/o título y cuerpo del mensaje; luego ocultar el hilo, silenciar notificaciones, mover a carpeta o desterrar al remitente (bloqueo completo).",
@@ -1396,6 +1470,51 @@
"flow_folder": "Carpeta",
"flow_no_rules": "Sin reglas"
},
+ "repository_server": {
+ "title": "Servidor de repositorio",
+ "description": "Redistribuya ruedas Python de MeshChatX y del ecosistema Reticulum, y sus propios archivos, por HTTP sin cifrar para que otros en su red o en este equipo puedan descargarlos.",
+ "subtitle": "Con red: actualice el conjunto de ruedas incluidas; añada archivos cuando quiera; abra una pequeña página de descargas en la app o use el servidor HTTP auxiliar.",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "Flash o actualizar el firmware RNode del navegador (herramienta soportada).",
@@ -1613,7 +1732,7 @@
},
"reticulum_config_editor": {
"title": "Reticulum Config Editor",
- "description": "Edite el archivo de configuración de Reticulum crudo en aplicación. Útil en móvil donde el archivo vive en almacenamiento privado.",
+ "description": "Edite el archivo de configuración central de Reticulum (RNS) dentro de MeshChatX. Reinicie RNS para que los cambios surtan efecto.",
"info": "Este es el archivo de configuración de Reticulum crudo. Ahorro no aplicará cambios hasta que se reinicia RNS.",
"loading": "Cargando config...",
"reload": "Recarga",
@@ -1638,7 +1757,7 @@
"tips_title": "Consejos",
"tip_sections": "El config debe contener secciones [reticulum] y [interfaces].",
"tip_restart": "Utilice el botón Reiniciar RNS o la página Interfaces para aplicar cambios.",
- "tip_mobile": "En el móvil esta es la manera más fácil de retocar Reticulum sin un editor externo."
+ "tip_mobile": "Útil cuando no quiere abrir el archivo en un editor externo en el disco."
},
"paper_message": {
"title": "Mensaje",
@@ -2190,6 +2309,8 @@
"nav_forwarder_desc": "LXMF forwarding rules",
"nav_documentation": "Documentación",
"nav_documentation_desc": "Manuales de línea",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "Ruedas MeshChatX, paquetes Reticulum y sus archivos por HTTP",
"nav_micron_editor": "Micron Editor",
"nav_micron_editor_desc": "Editar marca Micron",
"nav_reticulum_config_editor": "Reticulum Config Editor",

diff --git a/meshchatx/src/frontend/locales/fr.json b/meshchatx/src/frontend/locales/fr.json
index 68c4b00e..2951c9a6 100644
--- a/meshchatx/src/frontend/locales/fr.json
+++ b/meshchatx/src/frontend/locales/fr.json
@@ -814,7 +814,13 @@
"search_placeholder": "Rechercher un emplacement...",
"search_offline_error": "La recherche est uniquement disponible en mode en ligne",
"search_connection_error": "Impossible de se connecter au service de recherche. Veuillez vérifier votre connexion Internet.",
+ "search_timeout_error": "Le géocodeur n'a pas répondu à temps. Il est peut-être lent, surchargé ou inaccessible. Réessayez.",
"search_error": "Erreur de recherche",
+ "tile_connectivity_title": "Impossible de charger les tuiles de la carte",
+ "tile_connectivity_body": "Vérifiez le réseau, réessayez, utilisez un serveur de tuiles local dans les paramètres ou le mode hors ligne si vous avez des MBTiles.",
+ "tile_connectivity_retry": "Réessayer les tuiles",
+ "tile_connectivity_use_offline": "Mode hors ligne",
+ "tile_connectivity_dismiss": "Fermer",
"search_no_results": "Aucun résultat trouvé",
"custom_tile_server_unavailable": "Le serveur de tuiles personnalisé n'est pas accessible en mode hors ligne",
"custom_nominatim_unavailable": "Le serveur Nominatim personnalisé n'est pas accessible en mode hors ligne",
@@ -826,6 +832,19 @@
"tool_polygon": "Dessiner le polygone",
"tool_circle": "Dessiner le cercle",
"tool_measure": "Mesurer la distance/zone",
+ "tool_bearing": "Relèvement et distance (deux appuis, hors ligne)",
+ "tool_bearing_from_here": "Relèvement depuis ma position en un appui",
+ "bearing_geodesic": "Géodésique (grand cercle)",
+ "bearing_rhumb": "Loxodromie (relèvement constant)",
+ "bearing_forward": "Azimut avant",
+ "bearing_back": "Azimut arrière",
+ "bearing_rhumb_line": "Relèvement loxodromique / arrière",
+ "bearing_hint_first": "Appuyez sur le départ puis l'arrivée.",
+ "bearing_hint_second": "Appuyez sur le point d'arrivée.",
+ "bearing_hint_destination": "Appuyez sur la destination sur la carte.",
+ "bearing_from_here": "Utiliser ma position comme départ",
+ "bearing_help_first": "Départ puis arrivée",
+ "bearing_help_drag": "Déplacez le curseur pour l'aperçu",
"tool_clear": "Effacer les dessins",
"save_drawing": "Enregistrer le calque de dessin",
"load_drawing": "Charger la couche de dessin",
@@ -865,7 +884,42 @@
"location_not_determined": "Impossible de déterminer votre emplacement",
"geolocation_not_supported": "La géolocalisation n'est pas prise en charge par votre navigateur",
"no_nodes_location": "Aucun noeud découvert avec emplacement trouvé",
- "failed_fetch_nodes": "Impossible de récupérer les nœuds découverts pour la cartographie"
+ "failed_fetch_nodes": "Impossible de récupérer les nœuds découverts pour la cartographie",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "Désactiver",
@@ -916,6 +970,17 @@
"more_actions": "Autres actions",
"retry_failed": "Réessayer les messages échoués",
"telemetry_history": "Historique de la télémétrie",
+ "telemetry_history_modal_title": "Historique de télémétrie",
+ "telemetry_history_empty": "Aucun historique de télémétrie pour ce pair.",
+ "telemetry_history_done": "Terminé",
+ "telemetry_show_in_chat": "Afficher la télémétrie dans le chat principal",
+ "telemetry_battery_trend": "Tendance de la batterie",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "Envoyé",
+ "telemetry_label_received": "Reçu",
+ "telemetry_battery_level": "Batterie : {percent}%",
+ "telemetry_snr_db": "SNR : {snr} dB",
+ "telemetry_location_request": "Demande de localisation",
"start_call": "Appeler",
"share_contact": "Partager le contact",
"custom_display_name": "Affichage personnalisé",
@@ -972,6 +1037,11 @@
"failed_copy_message": "Impossible de copier le message",
"failed_send_ingest": "Échec de l'envoi de la demande d'ingestion",
"address_copied": "Votre adresse LXMF copiée dans le presse-papiers",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"hash_copied": "Le hash d'identité copié dans le presse-papiers",
"failed_to_copy_hash": "Impossible de copier le hash d'identité",
"failed_copy_address": "Impossible de copier l'adresse",
@@ -1054,7 +1124,7 @@
},
"debug": {
"title": "Débogues",
- "description": "Parcourir les journaux d'application et filtrez par niveau.",
+ "description": "Journaux d'application et d'accès, filtre par gravité et recherche pour le dépannage.",
"tab_logs": "Registres",
"tab_access_attempts": "Essais d'accès",
"search_logs_placeholder": "Registres de recherche...",
@@ -1257,7 +1327,7 @@
},
"docs": {
"title": "Documentation",
- "subtitle": "Manuels Reticulum et MeshChat.",
+ "subtitle": "Manuel Reticulum et guides MeshChatX, lisibles hors ligne une fois configurés.",
"status_title": "État de la documentation",
"status_extracting": "Extraction...",
"status_available": "Manuel hors ligne disponible",
@@ -1288,7 +1358,7 @@
"tools": {
"utilities": "Services publics",
"power_tools": "Services publics",
- "diagnostics_description": "Contrôles de connectivité, transferts, chemins, traduction, docs et aides matérielles en un seul endroit.",
+ "diagnostics_description": "Utilitaires mesh et Reticulum au même endroit : joignabilité, chemins, transfert de fichiers, traduction, documentation et aides matérielles. Ouvrez une ligne pour l'outil complet.",
"ping": {
"title": "Ping",
"description": "Mesurer le temps aller-retour vers une destination qui accepte ping."
@@ -1342,6 +1412,10 @@
"title": "Expéditeur",
"description": "Faire suivre LXMF entre les adresses avec un routage de réponse conservé."
},
+ "propagation_nodes": {
+ "title": "Nœuds de propagation",
+ "description": "Choisissez des nœuds de propagation préférés, consultez des statistiques en direct et lancez des vérifications de chemin."
+ },
"sieve_filters": {
"title": "Filtres tamis",
"description": "Faire correspondre du texte dans les champs du pair et/ou le titre et le corps du message, puis masquer le fil, couper les notifications, déplacer dans un dossier ou bannir l’expéditeur (blocage complet).",
@@ -1396,6 +1470,51 @@
"flow_folder": "Dossier",
"flow_no_rules": "Aucune règle"
},
+ "repository_server": {
+ "title": "Serveur de dépôt",
+ "description": "Redistribuez les wheels Python MeshChatX et de l'écosystème Reticulum, ainsi que vos propres fichiers, en HTTP clair pour que d'autres sur votre réseau ou sur cet appareil puissent les télécharger.",
+ "subtitle": "En ligne : actualisez le jeu de wheels fourni ; ajoutez vos fichiers quand vous voulez ; ouvrez une petite page de téléchargement dans l'application ou utilisez le serveur HTTP auxiliaire.",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "Flasher RNode",
"description": "Flash ou mettre à jour le micrologiciel RNode depuis le navigateur (matériel reconnu).",
@@ -1613,7 +1732,7 @@
},
"reticulum_config_editor": {
"title": "Réticulum Config Editor",
- "description": "Modifier le fichier de configuration brut de Reticulum dans l'application. Utile sur mobile où le fichier vit dans le stockage privé.",
+ "description": "Modifiez le fichier de configuration central de Reticulum (RNS) dans MeshChatX. Redémarrez RNS pour appliquer les changements.",
"info": "C'est le fichier de configuration brut de Reticulum. L'enregistrement n'appliquera aucune modification tant que RNS n'aura pas été redémarré.",
"loading": "Chargement de la configuration...",
"reload": "Recharger",
@@ -1638,7 +1757,7 @@
"tips_title": "Conseils",
"tip_sections": "La configuration doit contenir des sections [reticulum] et [interfaces].",
"tip_restart": "Utilisez le bouton Redémarrer RNS ou la page Interfaces pour appliquer les modifications.",
- "tip_mobile": "Sur mobile, c'est le moyen le plus simple de modifier Reticulum sans éditeur externe."
+ "tip_mobile": "Pratique lorsque vous ne souhaitez pas ouvrir le fichier dans un éditeur externe sur le disque."
},
"paper_message": {
"title": "Message papier",
@@ -2190,6 +2309,8 @@
"nav_forwarder_desc": "Règles de transmission LXMF",
"nav_documentation": "Documentation",
"nav_documentation_desc": "Manuels hors ligne",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "Wheels MeshChatX, paquets Reticulum et vos fichiers en HTTP",
"nav_micron_editor": "Éditeur de microns",
"nav_micron_editor_desc": "Modifier le balisage micron",
"nav_reticulum_config_editor": "Réticulum Config Editor",

diff --git a/meshchatx/src/frontend/locales/it.json b/meshchatx/src/frontend/locales/it.json
index f0d645b5..c86c69a7 100644
--- a/meshchatx/src/frontend/locales/it.json
+++ b/meshchatx/src/frontend/locales/it.json
@@ -866,7 +866,13 @@
"search_placeholder": "Cerca una posizione...",
"search_offline_error": "La ricerca è disponibile solo in modalità online",
"search_connection_error": "Impossibile connettersi al servizio di ricerca. Controlla la tua connessione internet.",
+ "search_timeout_error": "Il geocoder non ha risposto in tempo. Potrebbe essere lento, sovraccarico o irraggiungibile. Riprova.",
"search_error": "Errore di ricerca",
+ "tile_connectivity_title": "Impossibile caricare le tessere della mappa",
+ "tile_connectivity_body": "Controlla la rete, riprova, usa un server di tessere locale nelle impostazioni o la modalità offline se hai MBTiles.",
+ "tile_connectivity_retry": "Riprova tessere",
+ "tile_connectivity_use_offline": "Modalità offline",
+ "tile_connectivity_dismiss": "Chiudi",
"search_no_results": "Nessun risultato trovato",
"custom_tile_server_unavailable": "Il server tile personalizzato non è accessibile in modalità offline",
"custom_nominatim_unavailable": "Il server Nominatim personalizzato non è accessibile in modalità offline",
@@ -878,6 +884,19 @@
"tool_polygon": "Disegna Poligono",
"tool_circle": "Disegna Cerchio",
"tool_measure": "Misura Distanza/Area",
+ "tool_bearing": "Rilevamento e distanza (due tocchi, offline)",
+ "tool_bearing_from_here": "Rilevamento dalla mia posizione con un tocco",
+ "bearing_geodesic": "Geodetica (ortodromia)",
+ "bearing_rhumb": "Lossodromia (rilevamento costante)",
+ "bearing_forward": "Azimut in avanti",
+ "bearing_back": "Azimut indietro",
+ "bearing_rhumb_line": "Rilevamento lossodromico / indietro",
+ "bearing_hint_first": "Tocca l'inizio poi la fine.",
+ "bearing_hint_second": "Tocca il punto finale.",
+ "bearing_hint_destination": "Tocca la destinazione sulla mappa.",
+ "bearing_from_here": "Usa la mia posizione come partenza",
+ "bearing_help_first": "Tocca inizio e fine",
+ "bearing_help_drag": "Muovi il puntatore per l'anteprima",
"tool_clear": "Cancella Disegni",
"save_drawing": "Salva Livello Disegno",
"load_drawing": "Carica Livello Disegno",
@@ -917,7 +936,42 @@
"location_not_determined": "Impossibile determinare la tua posizione",
"geolocation_not_supported": "La geolocalizzazione non è supportata dal tuo browser",
"no_nodes_location": "Nessun nodo scoperto con posizione trovata",
- "failed_fetch_nodes": "Impossibile recuperare i nodi scoperti per la mappatura"
+ "failed_fetch_nodes": "Impossibile recuperare i nodi scoperti per la mappatura",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "Disabilita",
@@ -976,6 +1030,17 @@
"more_actions": "Altre azioni",
"retry_failed": "Riprova messaggi non inviati",
"telemetry_history": "Cronologia telemetria",
+ "telemetry_history_modal_title": "Cronologia telemetria",
+ "telemetry_history_empty": "Nessuna cronologia telemetria per questo peer.",
+ "telemetry_history_done": "Fatto",
+ "telemetry_show_in_chat": "Mostra telemetria nella chat principale",
+ "telemetry_battery_trend": "Andamento batteria",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "Inviato",
+ "telemetry_label_received": "Ricevuto",
+ "telemetry_battery_level": "Batteria: {percent}%",
+ "telemetry_snr_db": "SNR: {snr} dB",
+ "telemetry_location_request": "Richiesta posizione",
"start_call": "Chiama",
"share_contact": "Condividi contatto",
"opportunistic_deferred_label": "In attesa",
@@ -1026,6 +1091,11 @@
"failed_copy_message": "Impossibile copiare il messaggio",
"failed_send_ingest": "Impossibile inviare la richiesta di ingest",
"address_copied": "Il tuo indirizzo LXMF è stato copiato negli appunti",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"hash_copied": "Hash identità copiato negli appunti",
"failed_to_copy_hash": "Impossibile copiare l'hash identità",
"failed_copy_address": "Impossibile copiare l'indirizzo",
@@ -1106,7 +1176,7 @@
},
"debug": {
"title": "Log di Debug",
- "description": "Sfoglia i log dell'app e filtra per livello.",
+ "description": "Log di applicazione e di accesso, filtro per gravità e ricerca per la diagnosi.",
"tab_logs": "Log",
"tab_access_attempts": "Tentativi di accesso",
"search_logs_placeholder": "Cerca nei log...",
@@ -1309,7 +1379,7 @@
},
"docs": {
"title": "Documentazione",
- "subtitle": "Manuali Reticulum e MeshChat.",
+ "subtitle": "Manuale Reticulum e guide MeshChatX, consultabili offline dopo la configurazione.",
"status_title": "Stato Documentazione",
"status_extracting": "Estrazione in corso...",
"status_available": "Manuale Offline Disponibile",
@@ -1340,7 +1410,7 @@
"tools": {
"utilities": "Utilità",
"power_tools": "Utilità",
- "diagnostics_description": "Controlli di connettività, trasferimenti, percorsi, traduzione, manuali e assistenza hardware in un unico posto.",
+ "diagnostics_description": "Strumenti mesh e Reticulum in un unico posto: raggiungibilità, percorsi, trasferimento file, traduzione, documentazione e assistenza hardware. Apri una riga per lo strumento completo.",
"ping": {
"title": "Ping",
"description": "Misura il tempo di andata e ritorno verso una destinazione che accetta il ping."
@@ -1394,6 +1464,10 @@
"title": "Inoltro",
"description": "Inoltra LXMF tra indirizzi mantenendo il routing delle risposte."
},
+ "propagation_nodes": {
+ "title": "Nodi di propagazione",
+ "description": "Scegli nodi di propagazione preferiti, controlla statistiche in tempo reale ed esegui verifiche rapide sui percorsi."
+ },
"sieve_filters": {
"title": "Filtri a setaccio",
"description": "Confronta testo nei campi del peer e/o titolo e corpo del messaggio, poi nascondi la conversazione, silenzia le notifiche, sposta in cartella o bandisci il mittente (blocco completo).",
@@ -1448,6 +1522,51 @@
"flow_folder": "Cartella",
"flow_no_rules": "Nessuna regola"
},
+ "repository_server": {
+ "title": "Server repository",
+ "description": "Ridistribuisci le wheel Python di MeshChatX e dell'ecosistema Reticulum, più i tuoi file, su HTTP in chiaro così altri sulla tua rete o su questo dispositivo possono scaricarli.",
+ "subtitle": "Se connessi aggiorna il set di wheel inclusi; aggiungi file quando vuoi; apri una piccola pagina di download dall'app o usa il server HTTP separato.",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "Flasher RNode",
"description": "Flash o aggiorna il firmware RNode dal browser (hardware supportato).",
@@ -1665,7 +1784,7 @@
},
"reticulum_config_editor": {
"title": "Editor Configurazione Reticulum",
- "description": "Modifica il file di configurazione di Reticulum direttamente nell'app. Utile su mobile dove il file si trova nello storage privato.",
+ "description": "Modifica il file di configurazione centrale di Reticulum (RNS) in MeshChatX. Riavvia RNS perché le modifiche abbiano effetto.",
"info": "Questo è il file di configurazione di Reticulum. Il salvataggio non applicherà le modifiche finché RNS non sarà riavviato.",
"loading": "Caricamento configurazione...",
"reload": "Ricarica",
@@ -1690,7 +1809,7 @@
"tips_title": "Suggerimenti",
"tip_sections": "La configurazione deve contenere le sezioni [reticulum] e [interfaces].",
"tip_restart": "Usa il pulsante Riavvia RNS o la pagina Interfacce per applicare le modifiche.",
- "tip_mobile": "Su mobile questo è il modo più semplice per modificare Reticulum senza un editor esterno."
+ "tip_mobile": "Comodo quando non vuoi aprire il file in un editor esterno sul disco."
},
"paper_message": {
"title": "Messaggio Cartaceo",
@@ -2190,6 +2309,8 @@
"nav_forwarder_desc": "Regole di inoltro LXMF",
"nav_documentation": "Documentazione",
"nav_documentation_desc": "Manuali offline",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "Wheel MeshChatX, pacchetti Reticulum e i tuoi file via HTTP",
"nav_micron_editor": "Editor Micron",
"nav_micron_editor_desc": "Modifica markup Micron",
"nav_reticulum_config_editor": "Editor Configurazione Reticulum",

diff --git a/meshchatx/src/frontend/locales/nl.json b/meshchatx/src/frontend/locales/nl.json
index e9c7e4a4..256d1ece 100644
--- a/meshchatx/src/frontend/locales/nl.json
+++ b/meshchatx/src/frontend/locales/nl.json
@@ -814,7 +814,13 @@
"search_placeholder": "Zoek naar een locatie...",
"search_offline_error": "Zoeken is alleen beschikbaar in online modus",
"search_connection_error": "Fout bij verbinden met zoekservice. Controleer uw internetverbinding.",
+ "search_timeout_error": "De geocoder reageerde niet op tijd. De service kan traag, overbelast of onbereikbaar zijn. Probeer opnieuw.",
"search_error": "Zoekfout",
+ "tile_connectivity_title": "Kaarttegels konden niet worden geladen",
+ "tile_connectivity_body": "Controleer het netwerk, probeer opnieuw, gebruik een lokale tegelserver in instellingen of offlinemodus als u MBTiles heeft.",
+ "tile_connectivity_retry": "Tegels opnieuw proberen",
+ "tile_connectivity_use_offline": "Offlinemodus",
+ "tile_connectivity_dismiss": "Sluiten",
"search_no_results": "Geen resultaten gevonden",
"custom_tile_server_unavailable": "Aangepaste tile-server is niet toegankelijk in offline modus",
"custom_nominatim_unavailable": "Aangepaste Nominatim-server is niet toegankelijk in offline modus",
@@ -826,6 +832,19 @@
"tool_polygon": "Veelhoek tekenen",
"tool_circle": "Cirkel tekenen",
"tool_measure": "Meet afstand/gebied",
+ "tool_bearing": "Peiling en afstand (twee tikken, offline)",
+ "tool_bearing_from_here": "Peiling vanaf mijn locatie met één tik",
+ "bearing_geodesic": "Geodetisch (grote cirkel)",
+ "bearing_rhumb": "Loxodroom (constante peiling)",
+ "bearing_forward": "Voorwaartse azimut",
+ "bearing_back": "Terug azimut",
+ "bearing_rhumb_line": "Loxodroompeiling / terug",
+ "bearing_hint_first": "Tik startpunt, dan eindpunt.",
+ "bearing_hint_second": "Tik het eindpunt.",
+ "bearing_hint_destination": "Tik de bestemming op de kaart.",
+ "bearing_from_here": "Mijn locatie als start",
+ "bearing_help_first": "Tik start en eind",
+ "bearing_help_drag": "Beweeg de aanwijzer voor live info",
"tool_clear": "Tekeningen wissen",
"save_drawing": "Tekenlaag opslaan",
"load_drawing": "Tekenlaag laden",
@@ -865,7 +884,42 @@
"location_not_determined": "Kon uw locatie niet bepalen",
"geolocation_not_supported": "Geolocatie wordt niet ondersteund door uw browser",
"no_nodes_location": "Geen gevonden knooppunten met locatie gevonden",
- "failed_fetch_nodes": "Kon ontdekte knooppunten voor het in kaart brengen niet ophalen"
+ "failed_fetch_nodes": "Kon ontdekte knooppunten voor het in kaart brengen niet ophalen",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "Uitschakelen",
@@ -916,6 +970,17 @@
"more_actions": "Meer acties",
"retry_failed": "Opnieuw proberen van mislukte berichten",
"telemetry_history": "Telemetriegeschiedenis",
+ "telemetry_history_modal_title": "Telemetriegeschiedenis",
+ "telemetry_history_empty": "Geen telemetriegeschiedenis voor deze peer.",
+ "telemetry_history_done": "Klaar",
+ "telemetry_show_in_chat": "Telemetrie in hoofdchat tonen",
+ "telemetry_battery_trend": "Batterijtrend",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "Verzonden",
+ "telemetry_label_received": "Ontvangen",
+ "telemetry_battery_level": "Batterij: {percent}%",
+ "telemetry_snr_db": "SNR: {snr} dB",
+ "telemetry_location_request": "Locatieverzoek",
"start_call": "Oproep",
"share_contact": "Contact delen",
"custom_display_name": "Aangepaste schermnaam",
@@ -972,6 +1037,11 @@
"failed_copy_message": "Bericht kon niet worden gekopieerd",
"failed_send_ingest": "Kon het invoerverzoek niet versturen",
"address_copied": "Uw LXMF-adres gekopieerd naar klembord",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"hash_copied": "Identiteitshash gekopieerd naar klembord",
"failed_to_copy_hash": "Kopiëren van identiteitshash is mislukt",
"failed_copy_address": "Kopiëren van adres mislukt",
@@ -1054,7 +1124,7 @@
},
"debug": {
"title": "Debuglogs",
- "description": "Blader door de toepassing logs en filter op niveau.",
+ "description": "Applicatie- en toegangslogs, filter op ernst en doorzoeken voor probleemoplossing.",
"tab_logs": "Logs",
"tab_access_attempts": "Toegangspogingen",
"search_logs_placeholder": "Logboeken zoeken...",
@@ -1257,7 +1327,7 @@
},
"docs": {
"title": "Documentatie",
- "subtitle": "Reticulum en MeshChat handleidingen.",
+ "subtitle": "Reticulum-handleiding en MeshChatX-gidsen, offline te lezen na installatie.",
"status_title": "Documentatiestatus",
"status_extracting": "Uitpakken...",
"status_available": "Offline handleiding beschikbaar",
@@ -1288,7 +1358,7 @@
"tools": {
"utilities": "Hulpmiddelen",
"power_tools": "Hulpmiddelen",
- "diagnostics_description": "Connectiviteitscontroles, transfers, paden, vertalingen, documenten en hardwarehelpers op één plaats.",
+ "diagnostics_description": "Mesh- en Reticulumhulpprogramma's op één plek: bereikbaarheid, paden, bestandsoverdracht, vertaling, documentatie en hardwarehulpen. Open een rij voor de volledige tool.",
"ping": {
"title": "Ping",
"description": "Meet de rondreistijd naar een bestemming die ping accepteert."
@@ -1342,6 +1412,10 @@
"title": "Stuurprogramma",
"description": "Doorsturen LXMF tussen adressen met antwoord routing behouden."
},
+ "propagation_nodes": {
+ "title": "Propagatienodes",
+ "description": "Kies voorkeurs-propagatienodes, bekijk live statistieken en voer snelle padcontroles uit."
+ },
"sieve_filters": {
"title": "Zeeffilters",
"description": "Tekst in peer-velden en/of berichttitel en -inhoud matchen; gesprek verbergen, geen meldingen, naar map verplaatsen of afzender verbannen (volledige blokkade).",
@@ -1396,6 +1470,51 @@
"flow_folder": "Map",
"flow_no_rules": "Geen regels"
},
+ "repository_server": {
+ "title": "Repositoryserver",
+ "description": "Distribueer MeshChatX- en Reticulum-gerelateerde Python wheels plus uw eigen bestanden opnieuw via plat HTTP zodat anderen op uw netwerk of op dit apparaat ze kunnen downloaden.",
+ "subtitle": "Met internet: vernieuw de meegeleverde wheels; voeg op elk moment bestanden toe; start een kleine downloadpagina vanuit de app of gebruik de aparte HTTP-hulp.",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "Flash of update RNode firmware van de browser (ondersteunde hardware).",
@@ -1613,7 +1732,7 @@
},
"reticulum_config_editor": {
"title": "Reticulum Config Editor",
- "description": "Bewerk het rauwe Reticulum configuratiebestand in-app. Nuttig op mobiel waar het bestand woont in particuliere opslag.",
+ "description": "Bewerk het centrale Reticulum (RNS)-configuratiebestand binnen MeshChatX. Start RNS opnieuw om wijzigingen toe te passen.",
"info": "Dit is het rauwe Reticulum configuratiebestand. Opslaan is pas van toepassing als RNS opnieuw is gestart.",
"loading": "Configuratie laden...",
"reload": "Herladen",
@@ -1638,7 +1757,7 @@
"tips_title": "Tips",
"tip_sections": "De configuratie moet [reticulum] en [interfaces] secties bevatten.",
"tip_restart": "Gebruik de herstart RNS-knop of de interfacepagina om wijzigingen toe te passen.",
- "tip_mobile": "Op mobiel is dit de makkelijkste manier om Reticulum te tweaken zonder externe editor."
+ "tip_mobile": "Handig als u het bestand niet in een externe editor op schijf wilt openen."
},
"paper_message": {
"title": "Papierbericht",
@@ -2190,6 +2309,8 @@
"nav_forwarder_desc": "LXMF-doorstuurregels",
"nav_documentation": "Documentatie",
"nav_documentation_desc": "Offline handleidingen",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "MeshChatX-wheels, Reticulum-pakketten en uw bestanden via HTTP",
"nav_micron_editor": "Micron-editor",
"nav_micron_editor_desc": "Micron markup bewerken",
"nav_reticulum_config_editor": "Reticulum Config Editor",

diff --git a/meshchatx/src/frontend/locales/ru.json b/meshchatx/src/frontend/locales/ru.json
index 04ec61dd..0263fb58 100644
--- a/meshchatx/src/frontend/locales/ru.json
+++ b/meshchatx/src/frontend/locales/ru.json
@@ -866,7 +866,13 @@
"search_placeholder": "Поиск места...",
"search_offline_error": "Поиск доступен только в онлайн-режиме",
"search_connection_error": "Не удалось подключиться к сервису поиска. Проверьте подключение к интернету.",
+ "search_timeout_error": "Геокодер не ответил вовремя. Он может быть перегружен или недоступен. Повторите попытку.",
"search_error": "Ошибка поиска",
+ "tile_connectivity_title": "Не удалось загрузить тайлы карты",
+ "tile_connectivity_body": "Проверьте сеть, повторите попытку, используйте локальный тайл-сервер в настройках или офлайн-режим при наличии MBTiles.",
+ "tile_connectivity_retry": "Повторить загрузку тайлов",
+ "tile_connectivity_use_offline": "Офлайн-режим",
+ "tile_connectivity_dismiss": "Закрыть",
"search_no_results": "Результаты не найдены",
"custom_tile_server_unavailable": "Пользовательский сервер тайлов недоступен в офлайн-режиме",
"custom_nominatim_unavailable": "Пользовательский сервер Nominatim недоступен в офлайн-режиме",
@@ -878,6 +884,19 @@
"tool_polygon": "Полигон",
"tool_circle": "Круг",
"tool_measure": "Измерить",
+ "tool_bearing": "Пеленг и расстояние (два нажатия, офлайн)",
+ "tool_bearing_from_here": "Пеленг от моего местоположения одним нажатием",
+ "bearing_geodesic": "Геодезическая (ортодромия)",
+ "bearing_rhumb": "Локсодромия (постоянный пеленг)",
+ "bearing_forward": "Прямой азимут",
+ "bearing_back": "Обратный азимут",
+ "bearing_rhumb_line": "Локсодромический пеленг / обратный",
+ "bearing_hint_first": "Нажмите начало, затем конец.",
+ "bearing_hint_second": "Нажмите конечную точку.",
+ "bearing_hint_destination": "Нажмите пункт назначения на карте.",
+ "bearing_from_here": "Моё местоположение как старт",
+ "bearing_help_first": "Начало и конец",
+ "bearing_help_drag": "Двигайте указатель для подсказки",
"tool_clear": "Очистить",
"save_drawing": "Сохранить слой",
"load_drawing": "Загрузить слой",
@@ -917,7 +936,42 @@
"location_not_determined": "Could not determine your location",
"geolocation_not_supported": "Geolocation is not supported by your browser",
"no_nodes_location": "No discovered nodes with location found",
- "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping"
+ "failed_fetch_nodes": "Failed to fetch discovered nodes for mapping",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "Выключить",
@@ -976,6 +1030,17 @@
"more_actions": "Другие действия",
"retry_failed": "Повторить неудачные",
"telemetry_history": "История телеметрии",
+ "telemetry_history_modal_title": "История телеметрии",
+ "telemetry_history_empty": "Для этого пира нет истории телеметрии.",
+ "telemetry_history_done": "Готово",
+ "telemetry_show_in_chat": "Показывать телеметрию в основном чате",
+ "telemetry_battery_trend": "Динамика заряда",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "Отправлено",
+ "telemetry_label_received": "Получено",
+ "telemetry_battery_level": "Аккумулятор: {percent}%",
+ "telemetry_snr_db": "SNR: {snr} дБ",
+ "telemetry_location_request": "Запрос местоположения",
"start_call": "Звонок",
"share_contact": "Поделиться контактом",
"opportunistic_deferred_label": "Ожидание",
@@ -1026,6 +1091,11 @@
"failed_copy_message": "Не удалось скопировать сообщение",
"failed_send_ingest": "Failed to send ingest request",
"address_copied": "Your LXMF address copied to clipboard",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"failed_copy_address": "Failed to copy address",
"translation_failed": "Translation failed",
"failed_add_contact": "Failed to add contact",
@@ -1197,7 +1267,7 @@
},
"docs": {
"title": "Документация",
- "subtitle": "Руководства Reticulum и MeshChat.",
+ "subtitle": "Руководство Reticulum и справки MeshChatX, доступные офлайн после настройки.",
"status_title": "Статус документации",
"status_extracting": "Извлечение...",
"status_available": "Доступно офлайн",
@@ -1228,7 +1298,7 @@
"tools": {
"utilities": "Утилиты",
"power_tools": "Утилиты",
- "diagnostics_description": "Проверка связи, передачи файлов, путей, перевод, руководства и помощь с оборудованием в одном месте.",
+ "diagnostics_description": "Сетевые и Reticulum-утилиты в одном месте: доступность, маршруты, передача файлов, перевод, документация и помощь с оборудованием. Откройте строку для полного инструмента.",
"ping": {
"title": "Ping",
"description": "Измерение RTT до узла, который принимает ping."
@@ -1282,6 +1352,10 @@
"title": "Forwarder",
"description": "Пересылка LXMF между адресами с сохранением маршрута ответов."
},
+ "propagation_nodes": {
+ "title": "Узлы распространения",
+ "description": "Выбор предпочтительных узлов распространения, просмотр статистики в реальном времени и быстрая проверка маршрутов."
+ },
"sieve_filters": {
"title": "Сито-фильтры",
"description": "Сопоставлять текст в полях пира и/или заголовке и теле сообщения, затем скрыть беседу, отключить уведомления, переместить в папку или изгнать отправителя (полная блокировка).",
@@ -1336,6 +1410,51 @@
"flow_folder": "Папка",
"flow_no_rules": "Нет правил"
},
+ "repository_server": {
+ "title": "Сервер репозитория",
+ "description": "Повторно распространяйте Python-колёса MeshChatX и экосистемы Reticulum плюс свои файлы по обычному HTTP, чтобы другие в сети или на этом устройстве могли их скачать.",
+ "subtitle": "При наличии сети обновите поставляемый набор колёс; добавляйте файлы; откройте небольшую страницу загрузки в приложении или используйте отдельный HTTP-сервер.",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "RNode Flasher",
"description": "Прошивка или обновление RNode из браузера (поддерживаемое оборудование).",
@@ -1553,7 +1672,7 @@
},
"reticulum_config_editor": {
"title": "Редактор конфигурации Reticulum",
- "description": "Редактируйте файл конфигурации Reticulum прямо в приложении. Полезно на мобильных устройствах, где файл находится в приватном хранилище.",
+ "description": "Редактируйте основной конфигурационный файл Reticulum (RNS) в MeshChatX. Перезапустите RNS, чтобы изменения вступили в силу.",
"info": "Это файл конфигурации Reticulum. Сохранение не применит изменения, пока RNS не будет перезапущен.",
"loading": "Загрузка конфигурации...",
"reload": "Перезагрузить",
@@ -1578,7 +1697,7 @@
"tips_title": "Подсказки",
"tip_sections": "Конфигурация должна содержать секции [reticulum] и [interfaces].",
"tip_restart": "Используйте кнопку Перезапустить RNS или страницу Интерфейсы, чтобы применить изменения.",
- "tip_mobile": "На мобильных устройствах это самый простой способ изменить настройки Reticulum без внешнего редактора."
+ "tip_mobile": "Удобно, когда не хотите открывать файл во внешнем редакторе на диске."
},
"paper_message": {
"title": "Бумажное сообщение",
@@ -2078,6 +2197,8 @@
"nav_forwarder_desc": "Правила пересылки LXMF",
"nav_documentation": "Документация",
"nav_documentation_desc": "Офлайн-руководства",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "Колёса MeshChatX, пакеты Reticulum и ваши файлы по HTTP",
"nav_micron_editor": "Редактор Micron",
"nav_micron_editor_desc": "Редактировать разметку Micron",
"nav_reticulum_config_editor": "Редактор конфигурации Reticulum",
@@ -2119,7 +2240,7 @@
},
"debug": {
"title": "Журнал отладки",
- "description": "Просмотр журналов приложения и фильтрация по уровню.",
+ "description": "Журналы приложения и доступа, фильтр по уровню и поиск для диагностики.",
"tab_logs": "Журналы",
"tab_access_attempts": "Попытки доступа",
"search_logs_placeholder": "Поиск в журналах...",

diff --git a/meshchatx/src/frontend/locales/zh.json b/meshchatx/src/frontend/locales/zh.json
index 131b0b4b..90ad4c05 100644
--- a/meshchatx/src/frontend/locales/zh.json
+++ b/meshchatx/src/frontend/locales/zh.json
@@ -814,7 +814,13 @@
"search_placeholder": "搜索位置...",
"search_offline_error": "搜索仅在在线模式下可用",
"search_connection_error": "连接搜索服务失败。请检查您的互联网连接。",
+ "search_timeout_error": "地理编码服务响应超时,可能较慢、繁忙或不可达,请重试。",
"search_error": "搜索错误",
+ "tile_connectivity_title": "无法加载地图瓦片",
+ "tile_connectivity_body": "请检查网络后重试,在设置中使用本地瓦片服务,或若已导入 MBTiles 可切换到离线模式。",
+ "tile_connectivity_retry": "重试瓦片",
+ "tile_connectivity_use_offline": "离线模式",
+ "tile_connectivity_dismiss": "关闭",
"search_no_results": "未找到结果",
"custom_tile_server_unavailable": "自定义瓦片服务器在离线模式下不可用",
"custom_nominatim_unavailable": "自定义 Nominatim 服务器在离线模式下不可用",
@@ -826,6 +832,19 @@
"tool_polygon": "绘制多边形",
"tool_circle": "绘制圆形",
"tool_measure": "测量距离/面积",
+ "tool_bearing": "方位与距离(两次点击,离线)",
+ "tool_bearing_from_here": "从我的位置一次点击测方位",
+ "bearing_geodesic": "大地线(大圆)",
+ "bearing_rhumb": "等角航线(恒向线)",
+ "bearing_forward": "正方位角",
+ "bearing_back": "反方位角",
+ "bearing_rhumb_line": "恒向线方位 / 反向",
+ "bearing_hint_first": "先点击起点,再点击终点。",
+ "bearing_hint_second": "点击终点。",
+ "bearing_hint_destination": "在地图上点击目的地。",
+ "bearing_from_here": "用我的位置作为起点",
+ "bearing_help_first": "点击起点和终点",
+ "bearing_help_drag": "移动指针可实时查看",
"tool_clear": "清除绘图",
"save_drawing": "保存绘图图层",
"load_drawing": "加载绘图图层",
@@ -865,7 +884,42 @@
"location_not_determined": "无法确定您的位置",
"geolocation_not_supported": "您的浏览器不支持地理位置",
"no_nodes_location": "未找到该位置的节点",
- "failed_fetch_nodes": "获取已发现的地图节点失败"
+ "failed_fetch_nodes": "获取已发现的地图节点失败",
+ "share_view": "Share map view (copy links)",
+ "share_message_prefix": "MeshChatX map:",
+ "share_copied": "Map links copied to clipboard",
+ "ping_here": "Ping here (send in chat)",
+ "ping_here_toolbar": "Ping map center in chat",
+ "ping_modal_title": "Send map ping",
+ "ping_destination": "Destination",
+ "ping_pick_conversation": "Choose a conversation",
+ "ping_send": "Send ping",
+ "ping_sent": "Map ping sent",
+ "ping_failed": "Could not send map ping",
+ "ping_invalid_destination": "Pick a valid 32-character destination hash",
+ "ping_message_prefix": "MeshChatX map ping:",
+ "north_up": "North is up (map not rotated)",
+ "export_tile_limit_exceeded": "Too many tiles for one export. Lower max zoom or shrink the area.",
+ "export_region_world": "World (low zoom)",
+ "export_region_europe": "Europe",
+ "export_region_north_america": "North America",
+ "export_region_south_america": "South America",
+ "export_region_africa": "Africa",
+ "export_region_asia": "Asia",
+ "export_region_oceania": "Oceania",
+ "vector_exchange_title": "GeoJSON / KML / KMZ",
+ "vector_exchange_merge": "Merge with existing drawings (uncheck to replace)",
+ "vector_exchange_hint": "Imports support icons via mcx_icon_href, mcx_icon_data_url (data URIs), Mapbox simplestyle marker-color, and KML/KMZ IconStyle. KMZ packs KML with embedded images. Name, description, and extra properties import/export with GeoJSON and KML; select a drawing to see metadata above it.",
+ "vector_import_geojson": "Import GeoJSON",
+ "vector_import_kml": "Import KML",
+ "vector_import_kmz": "Import KMZ",
+ "vector_export_geojson": "Export GeoJSON",
+ "vector_export_kml": "Export KML",
+ "vector_export_kmz": "Export KMZ",
+ "vector_import_ok": "Imported {count} feature(s).",
+ "vector_import_empty": "No features found in file.",
+ "vector_import_failed": "Could not read vector file.",
+ "vector_export_ok": "Export started."
},
"interface": {
"disable": "禁用",
@@ -916,6 +970,17 @@
"more_actions": "更多操作",
"retry_failed": "重试失败的消息",
"telemetry_history": "遥测历史",
+ "telemetry_history_modal_title": "遥测历史",
+ "telemetry_history_empty": "此端点没有遥测历史记录。",
+ "telemetry_history_done": "完成",
+ "telemetry_show_in_chat": "在主聊天中显示遥测",
+ "telemetry_battery_trend": "电量趋势",
+ "telemetry_battery_range": "{from}% → {to}%",
+ "telemetry_label_sent": "已发送",
+ "telemetry_label_received": "已接收",
+ "telemetry_battery_level": "电量:{percent}%",
+ "telemetry_snr_db": "信噪比:{snr} dB",
+ "telemetry_location_request": "位置请求",
"start_call": "开始通话",
"share_contact": "分享联系人",
"custom_display_name": "自定义显示名称",
@@ -972,6 +1037,11 @@
"failed_copy_message": "无法复制消息",
"failed_send_ingest": "发送摄取请求失败",
"address_copied": "您的 LXMF 地址已复制到剪贴板",
+ "map_link_share_title": "Shared map view",
+ "map_link_ping_title": "Map ping",
+ "map_link_open": "Open on map",
+ "map_link_copy_uri": "Copy meshchatx link",
+ "map_link_copied": "Map link copied",
"hash_copied": "身份哈希已复制到剪贴板",
"failed_to_copy_hash": "复制身份哈希失败",
"failed_copy_address": "复制地址失败",
@@ -1054,7 +1124,7 @@
},
"debug": {
"title": "调试日志",
- "description": "按级别浏览应用程序日志和过滤器.",
+ "description": "应用与访问日志,按严重程度筛选并搜索,辅助排查问题。",
"tab_logs": "日志",
"tab_access_attempts": "访问尝试",
"search_logs_placeholder": "搜索日志...",
@@ -1257,7 +1327,7 @@
},
"docs": {
"title": "文档",
- "subtitle": "Reticulum和MeshChat手册。",
+ "subtitle": "Reticulum 手册与 MeshChatX 指南,配置后可离线阅读。",
"status_title": "文件状况",
"status_extracting": "正在解压...",
"status_available": "离线手册可用",
@@ -1288,7 +1358,7 @@
"tools": {
"utilities": "公用事业",
"power_tools": "公用事业",
- "diagnostics_description": "连接性检查,传输,路径,翻译,文件,以及硬件帮助器在一个地方.",
+ "diagnostics_description": "网格与 Reticulum 常用工具集中在一处:可达性、路径、文件传输、翻译、文档与硬件辅助。点击任一行打开完整工具。",
"ping": {
"title": "ing",
"description": "测量到一个接受ping的目的地的往返时间。"
@@ -1342,6 +1412,10 @@
"title": "转发器",
"description": "在地址之间转发 LXMF, 并保留回执路径 。"
},
+ "propagation_nodes": {
+ "title": "传播节点",
+ "description": "选择偏好的传播节点,查看实时统计数据并快速检查路径。"
+ },
"sieve_filters": {
"title": "筛选规则",
"description": "在对等方字段和/或消息标题与正文中匹配文本,然后隐藏会话、关闭通知、移入文件夹或放逐发送方(完全屏蔽)。",
@@ -1396,6 +1470,51 @@
"flow_folder": "文件夹",
"flow_no_rules": "无规则"
},
+ "repository_server": {
+ "title": "软件仓库服务器",
+ "description": "通过明文 HTTP 重新分发 MeshChatX 与 Reticulum 相关 Python 安装包,以及您自己的文件,供局域网或本机下载。",
+ "subtitle": "联网时可刷新内置安装包集合;随时添加文件;在应用内打开小型下载页或单独的 HTTP 服务。",
+ "back_tools": "Back to tools",
+ "http_heading": "Plain HTTP mirror",
+ "host_label": "Listen address",
+ "port_label": "Port",
+ "start_http": "Start",
+ "stop_http": "Stop",
+ "restart_http": "Restart",
+ "http_listen_label": "Listening:",
+ "open_http": "Open in browser",
+ "http_started": "HTTP server started",
+ "http_stopped": "HTTP server stopped",
+ "http_restarted": "HTTP server restarted",
+ "http_err_generic": "HTTP server request failed",
+ "http_err_invalid_host": "Invalid listen address",
+ "http_err_invalid_port": "Invalid port",
+ "http_err_already_running": "HTTP server is already running",
+ "http_err_bind_failed": "Could not bind (port in use or permission denied)",
+ "upload_heading": "Upload file",
+ "choose_file": "Choose file",
+ "refresh_bundled_tooltip": "Download bundled wheels to this device (needs network)",
+ "refresh_started": "Downloading bundled packages…",
+ "refresh_fetching": "Getting {pkg}…",
+ "refresh_ok": "Bundled wheels refreshed",
+ "refresh_ok_count": "{n} packages downloaded",
+ "refresh_failed": "Could not refresh bundled wheels",
+ "refresh_pip_missing": "pip was not found on this system. Install pip and try again.",
+ "refresh_partial": "Some packages could not be downloaded (details below)",
+ "refresh_partial_toast": "Bundled download finished with some failures",
+ "files_heading": "Files",
+ "col_name": "Name",
+ "col_source": "Source",
+ "col_size": "Size",
+ "empty": "No files yet. Upload a file or refresh bundled wheels.",
+ "delete": "Delete",
+ "delete_confirm": "Delete uploaded file \"{name}\"?",
+ "delete_ok": "File removed",
+ "delete_failed": "Could not delete file",
+ "upload_ok": "File uploaded",
+ "upload_failed": "Upload failed",
+ "load_failed": "Could not load repository"
+ },
"rnode_flasher": {
"title": "R 节点闪光器",
"description": "从浏览器(支持的硬件)中闪出或更新RNode固件.",
@@ -1613,7 +1732,7 @@
},
"reticulum_config_editor": {
"title": "Reticulum 配置编辑器",
- "description": "在应用中编辑原始 Reticulum 配置文件 。 在移动中有用, 文件存放在私人存储处 。",
+ "description": "在 MeshChatX 内编辑 Reticulum (RNS) 主配置文件。重启 RNS 后更改才会生效。",
"info": "这是原始 Reticulum 配置文件 。 在RNS重新启动之前保存不会应用更改 。",
"loading": "正在装入配置...",
"reload": "重新装入",
@@ -1638,7 +1757,7 @@
"tips_title": "提示",
"tip_sections": "配置必须包含 [reticulum]和 [interfaces] 部分.",
"tip_restart": "使用重新启动 RNS 按钮或界面页面应用更改.",
- "tip_mobile": "在移动中, 这是最简单的方法 来调整 Reticulum 没有外部编辑器。"
+ "tip_mobile": "当您不想用系统上的外部编辑器打开该文件时会很方便。"
},
"paper_message": {
"title": "纸质信件",
@@ -2190,6 +2309,8 @@
"nav_forwarder_desc": "LXMF 转发规则",
"nav_documentation": "文档",
"nav_documentation_desc": "离线手册",
+ "nav_repository_server": "Repository server",
+ "nav_repository_server_desc": "MeshChatX 安装包、Reticulum 软件包与您的文件(HTTP)",
"nav_micron_editor": "Micron 编辑器",
"nav_micron_editor_desc": "编辑 Micron 标记",
"nav_reticulum_config_editor": "Reticulum 配置编辑器",


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────